import 'dart:io';

main() {
  // 测试1：
  // print('开始获取数据');
  // 如果getData函数的返回值被Future修饰了，那么getData就是一个异步函数了
  // getData().then((res)=>{
  //   // res就是Future返回的内容
  //   print(res)//666
  // });
  // print('结束获取数据');
  // 测试2：
  // print('开始登录');
  // login().then((res) => {
  //   print('结束登录$res')
  // });
  // 测试3：
  try{
    // 防止Futrue是失败的状态
    init();
  }catch(err){
    print('接口调用异常');
  }
  // 拓展：
  // 1.成功的promise
  // Future.value(123);
  // 2.失败的promise
  // Future.error(456);
  // 3.类似于定时器(隔一段时间执行)
  Future.delayed(Duration(seconds: 3),(){
      print('我是延时器');
  });
  
}
// JS Ts ArkTS  ->  Promise
// Dart  ->  Future

Future<int> getData() {
  // 如果一段代码你希望异步执行，直接使用Futrue((){ xxx要执行的代码体 })

  return Future(() {
    print('获取数据Start');
    // 模拟获取数据 - 睡眠5秒，等待状态（阻塞代码）
    sleep(Duration(seconds: 5));
    print('获取数据End');
    return 666;
  });
}

// 模拟实现登录
Future<int> login() {
  // 将同步转异步
  return Future(() {
    print('开始调用接口');
    sleep(Duration(seconds: 3));
    print('拿到token值');
    return 123456;
  });
}

// 模拟获取用户信息
Future<String> getUserInfo() {
  return Future(() {
    print('开始获取用户信息');
    sleep(Duration(seconds: 2));
    print('拿到用户信息');
    return '张三';
  });
}
// 语法： 返回值 函数名() async {}
void init() async {
  var token = await login();
  // 打印token
  print(token);
  var res = await getUserInfo();
  print(res);
}


// 总结：Future就是Primise
// Future((){
//   要进行同步转异步的代码体
// })

// 练习：Future类型的函数
// 1.有一个异步获取token的登录方法
// 2.有一个异步获取用户新的的方法
// 3.先拿token在拿用户信息
